PT Industri Jamu dan Farmasi Sido Muncul Tbk, yang dikenal dengan ticker SIDO, adalah salah satu perusahaan terkemuka di Indonesia dalam industri jamu, farmasi, dan minuman kesehatan. Dalam analisis ini, kita akan melakukan dua jenis analisis utama untuk memahami kinerja saham SIDO.
Analisis fundamental melibatkan pemeriksaan mendalam terhadap laporan keuangan perusahaan untuk menentukan nilai intrinsik saham. Dalam bagian ini, kita akan menganalisis berbagai aspek seperti:
Tujuan dari analisis fundamental adalah untuk menentukan apakah saham SIDO saat ini undervalued atau overvalued dibandingkan dengan nilai intrinsiknya.
Analisis teknikal menggunakan data historis harga dan volume perdagangan untuk mengidentifikasi pola dan tren yang dapat digunakan untuk memprediksi pergerakan harga saham di masa depan. Dalam bagian ini, kita akan menggunakan berbagai indikator teknikal seperti:
Tujuan dari analisis teknikal adalah untuk menentukan titik masuk dan keluar yang optimal untuk perdagangan saham berdasarkan pola dan tren yang teridentifikasi.
Dengan pendekatan ini, diharapkan dapat memberikan wawasan yang komprehensif tentang kinerja saham SIDO dan memprediksi pergerakan harganya di masa depan.
# Import Library
from datetime import timedelta
from matplotlib import gridspec
from plotly.subplots import make_subplots
import numpy as np
import pandas as pd
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.pylab
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go
import warnings
warnings.filterwarnings('ignore')
# Import yfinance
import yfinance as yf
# Load Data SIDO
ticker = 'SIDO.JK'
company = yf.Ticker(ticker)
# Menampilkan data Income Statement SIDO
income_statement = company.financials
income_statement
| 2023-12-31 | 2022-12-31 | 2021-12-31 | 2020-12-31 | 2019-12-31 | |
|---|---|---|---|---|---|
| Tax Effect Of Unusual Items | 295009965.240964 | 144046394.976378 | 54818921.158842 | 59545852.271022 | NaN |
| Tax Rate For Calcs | 0.220486 | 0.221951 | 0.218402 | 0.22136 | NaN |
| Normalized EBITDA | 1228212000000.0 | 1426341000000.0 | 1620230000000.0 | 1207774000000.0 | NaN |
| Total Unusual Items | 1338000000.0 | 649000000.0 | 251000000.0 | 269000000.0 | NaN |
| Total Unusual Items Excluding Goodwill | 1338000000.0 | 649000000.0 | 251000000.0 | 269000000.0 | NaN |
| Net Income From Continuing Operation Net Minority Interest | 950648000000.0 | 1104714000000.0 | 1260898000000.0 | 934016000000.0 | NaN |
| Reconciled Depreciation | 9469000000.0 | 6496000000.0 | 6511000000.0 | 8080000000.0 | NaN |
| Reconciled Cost Of Revenue | 1547235000000.0 | 1696832000000.0 | 1734948000000.0 | 1496628000000.0 | NaN |
| EBITDA | 1229550000000.0 | 1426990000000.0 | 1620481000000.0 | 1208043000000.0 | NaN |
| EBIT | 1220081000000.0 | 1420494000000.0 | 1613970000000.0 | 1199963000000.0 | NaN |
| Net Interest Income | 28668000000.0 | 26786000000.0 | 36539000000.0 | 48517000000.0 | NaN |
| Interest Expense | 542000000.0 | 642000000.0 | 739000000.0 | 415000000.0 | NaN |
| Interest Income | 29349000000.0 | 27566000000.0 | 37401000000.0 | 49045000000.0 | NaN |
| Normalized Income | 949605009965.240967 | 1104209046394.976318 | 1260701818921.158936 | 933806545852.270996 | NaN |
| Net Income From Continuing And Discontinued Operation | 950648000000.0 | 1104714000000.0 | 1260898000000.0 | 934016000000.0 | NaN |
| Total Expenses | 2357990000000.0 | 2490765000000.0 | 2460542000000.0 | 2191955000000.0 | NaN |
| Rent Expense Supplemental | 3935000000.0 | 3052000000.0 | 3124000000.0 | 4394000000.0 | NaN |
| Total Operating Income As Reported | 1190871000000.0 | 1393066000000.0 | 1576692000000.0 | 1151025000000.0 | NaN |
| Diluted Average Shares | 30000000000.0 | 30000000000.0 | 29825671066.0 | 29768471800.0 | NaN |
| Basic Average Shares | 30000000000.0 | 30000000000.0 | 29825671066.0 | 29768471800.0 | NaN |
| Diluted EPS | 31.69 | 36.82 | 42.28 | 31.38 | NaN |
| Basic EPS | 31.69 | 36.82 | 42.28 | 31.38 | NaN |
| Diluted NI Availto Com Stockholders | 950648000000.0 | 1104714000000.0 | 1260898000000.0 | 934016000000.0 | NaN |
| Net Income Common Stockholders | 950648000000.0 | 1104714000000.0 | 1260898000000.0 | 934016000000.0 | NaN |
| Otherunder Preferred Stock Dividend | 0.0 | 0.0 | 0.0 | 0.0 | NaN |
| Net Income | 950648000000.0 | 1104714000000.0 | 1260898000000.0 | 934016000000.0 | NaN |
| Minority Interests | 0.0 | 0.0 | 0.0 | 0.0 | NaN |
| Net Income Including Noncontrolling Interests | 950648000000.0 | 1104714000000.0 | 1260898000000.0 | 934016000000.0 | NaN |
| Net Income Continuous Operations | 950648000000.0 | 1104714000000.0 | 1260898000000.0 | 934016000000.0 | NaN |
| Tax Provision | 268891000000.0 | 315138000000.0 | 352333000000.0 | 265532000000.0 | NaN |
| Pretax Income | 1219539000000.0 | 1419852000000.0 | 1613231000000.0 | 1199548000000.0 | NaN |
| Other Non Operating Income Expenses | 24433000000.0 | 8490000000.0 | 20761000000.0 | 8535000000.0 | NaN |
| Special Income Charges | 1338000000.0 | 649000000.0 | 251000000.0 | 269000000.0 | NaN |
| Other Special Charges | -1338000000.0 | -649000000.0 | -251000000.0 | -269000000.0 | NaN |
| Write Off | NaN | NaN | 53000000.0 | 2338000000.0 | 0.0 |
| Net Non Operating Interest Income Expense | 28668000000.0 | 26786000000.0 | 36539000000.0 | 48517000000.0 | NaN |
| Total Other Finance Cost | 139000000.0 | 138000000.0 | 123000000.0 | 113000000.0 | NaN |
| Interest Expense Non Operating | 542000000.0 | 642000000.0 | 739000000.0 | 415000000.0 | NaN |
| Interest Income Non Operating | 29349000000.0 | 27566000000.0 | 37401000000.0 | 49045000000.0 | NaN |
| Operating Income | 1207940000000.0 | 1374758000000.0 | 1560438000000.0 | 1143456000000.0 | NaN |
| Operating Expense | 810755000000.0 | 793933000000.0 | 725594000000.0 | 695327000000.0 | NaN |
| Other Operating Expenses | 35771000000.0 | -55000000.0 | -410000000.0 | 2338000000.0 | NaN |
| Depreciation And Amortization In Income Statement | 9469000000.0 | 6496000000.0 | 6511000000.0 | 8080000000.0 | NaN |
| Depreciation Income Statement | 9469000000.0 | 6496000000.0 | 6511000000.0 | 8080000000.0 | NaN |
| Selling General And Administration | 511243000000.0 | 521506000000.0 | 499556000000.0 | 474717000000.0 | NaN |
| Selling And Marketing Expense | 478127000000.0 | 482995000000.0 | 475476000000.0 | 427022000000.0 | NaN |
| General And Administrative Expense | 33116000000.0 | 38511000000.0 | 24080000000.0 | 47695000000.0 | NaN |
| Rent And Landing Fees | 3935000000.0 | 3052000000.0 | 3124000000.0 | 4394000000.0 | NaN |
| Gross Profit | 2018695000000.0 | 2168691000000.0 | 2286032000000.0 | 1838783000000.0 | NaN |
| Cost Of Revenue | 1547235000000.0 | 1696832000000.0 | 1734948000000.0 | 1496628000000.0 | NaN |
| Total Revenue | 3565930000000.0 | 3865523000000.0 | 4020980000000.0 | 3335411000000.0 | NaN |
| Operating Revenue | 3565930000000.0 | 3865523000000.0 | 4020980000000.0 | 3335411000000.0 | NaN |
# Transpose data Income Statement
ic_transposed = income_statement.T
ic_transposed
| Tax Effect Of Unusual Items | Tax Rate For Calcs | Normalized EBITDA | Total Unusual Items | Total Unusual Items Excluding Goodwill | Net Income From Continuing Operation Net Minority Interest | Reconciled Depreciation | Reconciled Cost Of Revenue | EBITDA | EBIT | ... | Depreciation And Amortization In Income Statement | Depreciation Income Statement | Selling General And Administration | Selling And Marketing Expense | General And Administrative Expense | Rent And Landing Fees | Gross Profit | Cost Of Revenue | Total Revenue | Operating Revenue | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2023-12-31 | 295009965.240964 | 0.220486 | 1228212000000.0 | 1338000000.0 | 1338000000.0 | 950648000000.0 | 9469000000.0 | 1547235000000.0 | 1229550000000.0 | 1220081000000.0 | ... | 9469000000.0 | 9469000000.0 | 511243000000.0 | 478127000000.0 | 33116000000.0 | 3935000000.0 | 2018695000000.0 | 1547235000000.0 | 3565930000000.0 | 3565930000000.0 |
| 2022-12-31 | 144046394.976378 | 0.221951 | 1426341000000.0 | 649000000.0 | 649000000.0 | 1104714000000.0 | 6496000000.0 | 1696832000000.0 | 1426990000000.0 | 1420494000000.0 | ... | 6496000000.0 | 6496000000.0 | 521506000000.0 | 482995000000.0 | 38511000000.0 | 3052000000.0 | 2168691000000.0 | 1696832000000.0 | 3865523000000.0 | 3865523000000.0 |
| 2021-12-31 | 54818921.158842 | 0.218402 | 1620230000000.0 | 251000000.0 | 251000000.0 | 1260898000000.0 | 6511000000.0 | 1734948000000.0 | 1620481000000.0 | 1613970000000.0 | ... | 6511000000.0 | 6511000000.0 | 499556000000.0 | 475476000000.0 | 24080000000.0 | 3124000000.0 | 2286032000000.0 | 1734948000000.0 | 4020980000000.0 | 4020980000000.0 |
| 2020-12-31 | 59545852.271022 | 0.22136 | 1207774000000.0 | 269000000.0 | 269000000.0 | 934016000000.0 | 8080000000.0 | 1496628000000.0 | 1208043000000.0 | 1199963000000.0 | ... | 8080000000.0 | 8080000000.0 | 474717000000.0 | 427022000000.0 | 47695000000.0 | 4394000000.0 | 1838783000000.0 | 1496628000000.0 | 3335411000000.0 | 3335411000000.0 |
| 2019-12-31 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
5 rows × 52 columns
# Mengonversi dari satuan dasar ke miliar
ic_convert = ic_transposed[["Net Income", "Gross Profit", "Operating Income", "Total Revenue", "Cost Of Revenue"]] / 1e9
ic_convert
| Net Income | Gross Profit | Operating Income | Total Revenue | Cost Of Revenue | |
|---|---|---|---|---|---|
| 2023-12-31 | 950.648 | 2018.695 | 1207.94 | 3565.93 | 1547.235 |
| 2022-12-31 | 1104.714 | 2168.691 | 1374.758 | 3865.523 | 1696.832 |
| 2021-12-31 | 1260.898 | 2286.032 | 1560.438 | 4020.98 | 1734.948 |
| 2020-12-31 | 934.016 | 1838.783 | 1143.456 | 3335.411 | 1496.628 |
| 2019-12-31 | NaN | NaN | NaN | NaN | NaN |
# Menghapus data kosong
ic_cleaned = ic_convert.dropna(how='all')
ic_cleaned
| Net Income | Gross Profit | Operating Income | Total Revenue | Cost Of Revenue | |
|---|---|---|---|---|---|
| 2023-12-31 | 950.648 | 2018.695 | 1207.94 | 3565.93 | 1547.235 |
| 2022-12-31 | 1104.714 | 2168.691 | 1374.758 | 3865.523 | 1696.832 |
| 2021-12-31 | 1260.898 | 2286.032 | 1560.438 | 4020.98 | 1734.948 |
| 2020-12-31 | 934.016 | 1838.783 | 1143.456 | 3335.411 | 1496.628 |
# Menghitung Gross Profit Margin
gpm = ic_cleaned["Gross Profit"] / ic_cleaned["Total Revenue"] * 100
gpm
2023-12-31 56.610618 2022-12-31 56.10343 2021-12-31 56.852608 2020-12-31 55.129128 dtype: object
# Menghitung Operating Profit Margin
opm = ic_cleaned["Operating Income"] / ic_cleaned["Total Revenue"] * 100
opm
2023-12-31 33.874473 2022-12-31 35.564605 2021-12-31 38.807405 2020-12-31 34.282312 dtype: object
# Menghitung Net Profit Margin
npm = ic_cleaned["Net Income"] / ic_cleaned["Total Revenue"] * 100
npm
2023-12-31 26.659188 2022-12-31 28.578643 2021-12-31 31.357977 2020-12-31 28.003026 dtype: object
# Visualisasi Income Statement
from plotly.subplots import make_subplots
# Set dua y axis
fig = make_subplots(specs=[[{"secondary_y": True}]])
# Bar chart Total Revenue
fig.add_trace(
go.Bar(x=ic_cleaned.index,
y=ic_cleaned["Total Revenue"],
name = 'Total Revenue',
hovertemplate = None
), secondary_y=False)
# Bar chart Net Income
fig.add_trace(
go.Bar(x=ic_cleaned.index,
y=ic_cleaned["Net Income"],
name = 'Net Income',
hovertemplate = None
), secondary_y=False)
# Line chart Profit Margin
fig.add_trace(
go.Scatter(x=ic_cleaned.index, y=npm,
name = 'Profit Margin (%)',
hovertemplate = None
), secondary_y=True)
# Update layout menambahkan judul
fig.update_layout(
title=dict(
text="Income Statement SIDO",
x=0.5,
y=0.9,
font=dict(size=18)
), hovermode="x unified"
)
# Update axis
fig.update_yaxes(title_text="IDR", secondary_y=False, ticksuffix='B', hoverformat = "d")
fig.update_yaxes(title_text="(%)", secondary_y=True, hoverformat = ".2f")
fig.update_xaxes(
tickmode='array',
tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
ticktext=[str(year) for year in range(2020, 2024)]
)
Analisis dan Interpretasi
Pendapatan total menunjukkan peningkatan dari 2020 hingga 2021, namun menurun hingga 2023. Pada tahun 2020, pendapatan total sekitar 3,3 triliun IDR. Tahun 2021, pendapatan total meningkat menjadi sekitar 4 triliun IDR. Pada tahun 2023, pendapatan total turun sekitar 3,6 triliun IDR atau turun 7,75% dibandingkan pendapatan pada tahun sebelumnya sebesar Rp 3,86 triliun.
Pendapatan bersih mengikuti pola yang mirip dengan pendapatan total, dengan peningkatan pada tahun 2021 dan penurunan setelahnya. Tahun 2020, pendapatan bersih sekitar 934 miliar IDR. Tahun 2021, pendapatan bersih mencapai puncaknya sekitar 1,3 triliun IDR. Pada tahun 2023, pendapatan bersih turun sekitar 950 miliar IDR atau turun 13,95% dari tahun sebelumnya sekitar 1,10 triliun. Hal ini menunjukkan bahwa profitabilitas SIDO mengalami fluktuasi selama periode tersebut.
Profit margin meningkat tajam dari 2020 hingga 2021, namun menurun hingga 2023. Pada tahun 2020, profit margin sekitar 28%. Tahun 2021, profit margin mencapai puncaknya sekitar 31%. Pada tahun 2023, profit margin turun sekitar 26%. Penurunan profit margin setelah 2021 menunjukkan bahwa meskipun pendapatan bersih dan total pendapatan relatif stabil, efisiensi operasional atau manajemen biaya SIDO mengalami penurunan.
Secara keseluruhan, grafik income statement menunjukkan fluktuasi dalam pendapatan total dan pendapatan bersih SIDO dari tahun 2020 hingga 2023. Meskipun ada peningkatan yang signifikan pada 2021, terjadi penurunan kembali pada periode berikutnya. Terjadinya penurunan pada tahun 2023 dikarenakan lemahnya daya beli masyarakat khususnya pada kuartal 3 sehingga berdampak terhadap penjualan produk-produk Sido Muncul.
# Menampilkan Balance Sheet SIDO
balance_sheet = company.balance_sheet
balance_sheet
| 2023-12-31 | 2022-12-31 | 2021-12-31 | 2020-12-31 | 2019-12-31 | |
|---|---|---|---|---|---|
| Treasury Shares Number | NaN | NaN | 4514471.0 | 231532326.0 | 233043777.0 |
| Ordinary Shares Number | 30000000000.0 | 30000000000.0 | 29995485529.0 | 29997487673.0 | NaN |
| Share Issued | 30000000000.0 | 30000000000.0 | 30000000000.0 | 30229019999.0 | NaN |
| Total Debt | 9391000000.0 | 2385000000.0 | 8670000000.0 | 7190000000.0 | NaN |
| Tangible Book Value | 3257849000000.0 | 3376177000000.0 | 3341067000000.0 | 3089755000000.0 | NaN |
| ... | ... | ... | ... | ... | ... |
| Gross Accounts Receivable | 821392000000.0 | 686722000000.0 | 667191000000.0 | 669040000000.0 | NaN |
| Cash Cash Equivalents And Short Term Investments | 830128000000.0 | 923047000000.0 | 1082219000000.0 | 1031954000000.0 | NaN |
| Cash And Cash Equivalents | 830128000000.0 | 923047000000.0 | 1082219000000.0 | 1031954000000.0 | NaN |
| Cash Equivalents | 580861000000.0 | 720982000000.0 | 845862000000.0 | 658331000000.0 | NaN |
| Cash Financial | 249267000000.0 | 202065000000.0 | 236357000000.0 | 373623000000.0 | NaN |
70 rows × 5 columns
# Transpose data Balance Sheet
bs_transposed = balance_sheet.T
bs_transposed
| Treasury Shares Number | Ordinary Shares Number | Share Issued | Total Debt | Tangible Book Value | Invested Capital | Working Capital | Net Tangible Assets | Capital Lease Obligations | Common Stock Equity | ... | Raw Materials | Other Receivables | Taxes Receivable | Accounts Receivable | Allowance For Doubtful Accounts Receivable | Gross Accounts Receivable | Cash Cash Equivalents And Short Term Investments | Cash And Cash Equivalents | Cash Equivalents | Cash Financial | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2023-12-31 | NaN | 30000000000.0 | 30000000000.0 | 9391000000.0 | 3257849000000.0 | 3385934000000.0 | 1604791000000.0 | 3257849000000.0 | 9391000000.0 | 3385934000000.0 | ... | 282350000000.0 | 1806000000.0 | NaN | 788722000000.0 | -32670000000.0 | 821392000000.0 | 830128000000.0 | 830128000000.0 | 580861000000.0 | 249267000000.0 |
| 2022-12-31 | NaN | 30000000000.0 | 30000000000.0 | 2385000000.0 | 3376177000000.0 | 3505468000000.0 | 1653194000000.0 | 3376177000000.0 | 2385000000.0 | 3505468000000.0 | ... | 371828000000.0 | 2042000000.0 | NaN | 686662000000.0 | -60000000.0 | 686722000000.0 | 923047000000.0 | 923047000000.0 | 720982000000.0 | 202065000000.0 |
| 2021-12-31 | 4514471.0 | 29995485529.0 | 30000000000.0 | 8670000000.0 | 3341067000000.0 | 3471178000000.0 | 1701337000000.0 | 3341067000000.0 | 8670000000.0 | 3471178000000.0 | ... | 327471000000.0 | 3032000000.0 | NaN | 664058000000.0 | -3133000000.0 | 667191000000.0 | 1082219000000.0 | 1082219000000.0 | 845862000000.0 | 236357000000.0 |
| 2020-12-31 | 231532326.0 | 29997487673.0 | 30229019999.0 | 7190000000.0 | 3089755000000.0 | 3221733000000.0 | 1492038000000.0 | 3089755000000.0 | 7190000000.0 | 3221733000000.0 | ... | 222111000000.0 | 3890000000.0 | NaN | 663757000000.0 | -5283000000.0 | 669040000000.0 | 1031954000000.0 | 1031954000000.0 | 658331000000.0 | 373623000000.0 |
| 2019-12-31 | 233043777.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | 3544000000.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
5 rows × 70 columns
# Mengonversi dari satuan dasar ke miliar
bs_convert = bs_transposed[["Total Assets", "Total Liabilities Net Minority Interest", "Total Equity Gross Minority Interest"]] / 1e9
bs_convert
| Total Assets | Total Liabilities Net Minority Interest | Total Equity Gross Minority Interest | |
|---|---|---|---|
| 2023-12-31 | 3890.706 | 504.765 | 3385.941 |
| 2022-12-31 | 4081.442 | 575.967 | 3505.475 |
| 2021-12-31 | 4068.97 | 597.785 | 3471.185 |
| 2020-12-31 | 3849.516 | 627.776 | 3221.74 |
| 2019-12-31 | NaN | NaN | NaN |
# Menghapus data kosong
bs_cleaned = bs_convert.dropna(how='all')
bs_cleaned
| Total Assets | Total Liabilities Net Minority Interest | Total Equity Gross Minority Interest | |
|---|---|---|---|
| 2023-12-31 | 3890.706 | 504.765 | 3385.941 |
| 2022-12-31 | 4081.442 | 575.967 | 3505.475 |
| 2021-12-31 | 4068.97 | 597.785 | 3471.185 |
| 2020-12-31 | 3849.516 | 627.776 | 3221.74 |
# Menghitung rasio solvabilitas Debt on Equity Ratio (DER)
DER = bs_cleaned["Total Liabilities Net Minority Interest"] / bs_cleaned["Total Equity Gross Minority Interest"] *100
DER
2023-12-31 14.907673 2022-12-31 16.430498 2021-12-31 17.221352 2020-12-31 19.48562 dtype: object
# Menghitung rasio solvabilitas Debt on Assets Ratio (DAR)
DAR = bs_cleaned["Total Liabilities Net Minority Interest"] / bs_cleaned["Total Assets"] *100
DAR
2023-12-31 12.973609 2022-12-31 14.111851 2021-12-31 14.69131 2020-12-31 16.30792 dtype: object
# Visualisasi Balance Sheet
from plotly.subplots import make_subplots
# Set dua y axis
fig = make_subplots(specs=[[{"secondary_y": True}]])
# Bar chart Total Assets
fig.add_trace(
go.Bar(x=bs_cleaned.index,
y=bs_cleaned["Total Assets"],
name = 'Total Assets',
hovertemplate = None
), secondary_y=False)
# Bar chart Total Liabilities
fig.add_trace(
go.Bar(x=bs_cleaned.index,
y=bs_cleaned["Total Liabilities Net Minority Interest"],
name = 'Total Liability',
hovertemplate = None
), secondary_y=False)
# Bar chart Total Equity
fig.add_trace(
go.Bar(x=bs_cleaned.index,
y=bs_cleaned["Total Equity Gross Minority Interest"],
name = 'Total Equity',
hovertemplate = None
), secondary_y=False)
# Line chart Debt on Equity Ratio
fig.add_trace(
go.Scatter(x=bs_cleaned.index, y=DER,
name = 'DER (%)',
hovertemplate = None
), secondary_y=True)
# Update layout menambahkan judul
fig.update_layout(
title=dict(
text="Balance Sheet SIDO",
x=0.5,
y=0.9,
font=dict(size=18)
), hovermode="x unified"
)
# Update axis
fig.update_yaxes(title_text="IDR", ticksuffix='B', secondary_y=False, hoverformat = "d")
fig.update_yaxes(title_text="(%)", secondary_y=True, hoverformat = ".2f")
fig.update_xaxes(
tickmode='array',
tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
ticktext=[str(year) for year in range(2020, 2024)]
)
Analysis dan Interpretasi
Aset total SIDO cenderung stabil, berada di sekitar 3,8 triliun hingga 4 triliun IDR sepanjang periode. Stabilitas ini menunjukkan bahwa SIDO berhasil menjaga nilai asetnya secara konsisten selama periode ini.
Kewajiban total menunjukkan penurunan yang signifikan dari tahun 2020 hingga 2023. Pada tahun 2020, kewajiban total sekitar 628 miliar IDR. Pada tahun 2021 hingga 2023, kewajiban total menurun hingga mendekati 500 miliar IDR. Penurunan ini menunjukkan bahwa SIDO berhasil mengurangi kewajiban atau utangnya secara signifikan.
Ekuitas total menunjukkan peningkatan dari tahun 2020 hingga 2023. Pada tahun 2020, ekuitas total sekitar 3,2 triliun IDR. Pada tahun 2021 hingga 2023, ekuitas total meningkat mendekati 3,5 triliun IDR. Peningkatan ini mencerminkan bahwa nilai ekuitas pemegang saham dalam perusahaan bertambah seiring dengan pengurangan kewajiban dan stabilitas aset.
Debt to Equity Ratio (DER) menunjukkan penurunan yang konsisten dari tahun 2020 hingga 2023. Pada tahun 2020, DER sekitar 19%. Pada tahun 2023, DER turun menjadi sekitar 14,9%. Penurunan DER menunjukkan bahwa SIDO mengurangi proporsi utang terhadap ekuitasnya, yang menandakan perbaikan dalam struktur modal dan pengurangan risiko finansial.
Secara keseluruhan, grafik balance sheet SIDO menunjukkan bahwa SIDO telah mengalami peningkatan yang signifikan dalam hal stabilitas keuangan. Penurunan kewajiban total dan DER, serta peningkatan ekuitas total, menunjukkan bahwa perusahaan berhasil mengurangi utangnya secara signifikan dan meningkatkan nilai bagi pemegang saham. Stabilitas aset total menunjukkan manajemen aset yang baik, sementara penurunan kewajiban menunjukkan bahwa SIDO telah mengambil langkah-langkah untuk mengurangi risiko finansial dan meningkatkan stabilitas jangka panjang.
# Menampilkan cashflow SIDO
cash_flow = company.cashflow
cash_flow
| 2023-12-31 | 2022-12-31 | 2021-12-31 | 2020-12-31 | |
|---|---|---|---|---|
| Free Cash Flow | 1005007000000.0 | 928734000000.0 | 1076764000000.0 | 940615000000.0 |
| Issuance Of Capital Stock | 0.0 | 4055000000.0 | 6988000000.0 | 1264000000.0 |
| Capital Expenditure | -50387000000.0 | -178403000000.0 | -122553000000.0 | -95139000000.0 |
| End Cash Position | 830128000000.0 | 923047000000.0 | 1082219000000.0 | 1031954000000.0 |
| Beginning Cash Position | 923047000000.0 | 1082219000000.0 | 1031954000000.0 | 864824000000.0 |
| Effect Of Exchange Rate Changes | -27055000000.0 | 1543000000.0 | 446000000.0 | 1402000000.0 |
| Changes In Cash | -65864000000.0 | -160715000000.0 | 49819000000.0 | 165728000000.0 |
| Financing Cash Flow | -1074265000000.0 | -1088230000000.0 | -1025193000000.0 | -774907000000.0 |
| Net Other Financing Charges | NaN | NaN | -7664000000.0 | NaN |
| Cash Dividends Paid | -1068000000000.0 | -1086000000000.0 | -1018142000000.0 | -773988000000.0 |
| Common Stock Dividend Paid | -1068000000000.0 | -1086000000000.0 | -1018142000000.0 | -773988000000.0 |
| Net Common Stock Issuance | 0.0 | 4055000000.0 | 6988000000.0 | 1264000000.0 |
| Common Stock Issuance | 0.0 | 4055000000.0 | 6988000000.0 | 1264000000.0 |
| Investing Cash Flow | -46993000000.0 | -179622000000.0 | -124305000000.0 | -95119000000.0 |
| Net Other Investing Changes | -348000000.0 | -1905000000.0 | -2657000000.0 | -1134000000.0 |
| Net PPE Purchase And Sale | -46645000000.0 | -177717000000.0 | -121648000000.0 | -93985000000.0 |
| Sale Of PPE | 3742000000.0 | 686000000.0 | 905000000.0 | 1154000000.0 |
| Purchase Of PPE | -50387000000.0 | -178403000000.0 | -122553000000.0 | -95139000000.0 |
| Cash Flowsfromusedin Operating Activities Direct | 1055394000000.0 | 1107137000000.0 | 1199317000000.0 | 1035754000000.0 |
| Taxes Refund Paid Direct | -270119000000.0 | -336341000000.0 | -315523000000.0 | -244347000000.0 |
| Interest Received Direct | 29370000000.0 | 27562000000.0 | 37630000000.0 | 51002000000.0 |
| Interest Paid Direct | -681000000.0 | -780000000.0 | -862000000.0 | -522000000.0 |
| Classesof Cash Payments | -2152241000000.0 | -2434103000000.0 | -2546401000000.0 | -1990817000000.0 |
| Other Cash Paymentsfrom Operating Activities | -568884000000.0 | -519651000000.0 | -502481000000.0 | -443850000000.0 |
| Paymentson Behalfof Employees | -449325000000.0 | -447271000000.0 | -441328000000.0 | -368210000000.0 |
| Paymentsto Suppliersfor Goodsand Services | -1134032000000.0 | -1467181000000.0 | -1602592000000.0 | -1178757000000.0 |
| Classesof Cash Receiptsfrom Operating Activities | 3449065000000.0 | 3850799000000.0 | 4024473000000.0 | 3220438000000.0 |
| Receiptsfrom Customers | 3449065000000.0 | 3850799000000.0 | 4024473000000.0 | 3220438000000.0 |
# Transpose data Cash Flow
cf_transposed = cash_flow.T
cf_transposed
| Free Cash Flow | Issuance Of Capital Stock | Capital Expenditure | End Cash Position | Beginning Cash Position | Effect Of Exchange Rate Changes | Changes In Cash | Financing Cash Flow | Net Other Financing Charges | Cash Dividends Paid | ... | Cash Flowsfromusedin Operating Activities Direct | Taxes Refund Paid Direct | Interest Received Direct | Interest Paid Direct | Classesof Cash Payments | Other Cash Paymentsfrom Operating Activities | Paymentson Behalfof Employees | Paymentsto Suppliersfor Goodsand Services | Classesof Cash Receiptsfrom Operating Activities | Receiptsfrom Customers | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2023-12-31 | 1005007000000.0 | 0.0 | -50387000000.0 | 830128000000.0 | 923047000000.0 | -27055000000.0 | -65864000000.0 | -1074265000000.0 | NaN | -1068000000000.0 | ... | 1055394000000.0 | -270119000000.0 | 29370000000.0 | -681000000.0 | -2152241000000.0 | -568884000000.0 | -449325000000.0 | -1134032000000.0 | 3449065000000.0 | 3449065000000.0 |
| 2022-12-31 | 928734000000.0 | 4055000000.0 | -178403000000.0 | 923047000000.0 | 1082219000000.0 | 1543000000.0 | -160715000000.0 | -1088230000000.0 | NaN | -1086000000000.0 | ... | 1107137000000.0 | -336341000000.0 | 27562000000.0 | -780000000.0 | -2434103000000.0 | -519651000000.0 | -447271000000.0 | -1467181000000.0 | 3850799000000.0 | 3850799000000.0 |
| 2021-12-31 | 1076764000000.0 | 6988000000.0 | -122553000000.0 | 1082219000000.0 | 1031954000000.0 | 446000000.0 | 49819000000.0 | -1025193000000.0 | -7664000000.0 | -1018142000000.0 | ... | 1199317000000.0 | -315523000000.0 | 37630000000.0 | -862000000.0 | -2546401000000.0 | -502481000000.0 | -441328000000.0 | -1602592000000.0 | 4024473000000.0 | 4024473000000.0 |
| 2020-12-31 | 940615000000.0 | 1264000000.0 | -95139000000.0 | 1031954000000.0 | 864824000000.0 | 1402000000.0 | 165728000000.0 | -774907000000.0 | NaN | -773988000000.0 | ... | 1035754000000.0 | -244347000000.0 | 51002000000.0 | -522000000.0 | -1990817000000.0 | -443850000000.0 | -368210000000.0 | -1178757000000.0 | 3220438000000.0 | 3220438000000.0 |
4 rows × 28 columns
# Mengonversi dari satuan dasar ke miliar
cf_convert = cf_transposed[["Cash Flowsfromusedin Operating Activities Direct", "Investing Cash Flow", "Financing Cash Flow"]] / 1e9
cf_convert
| Cash Flowsfromusedin Operating Activities Direct | Investing Cash Flow | Financing Cash Flow | |
|---|---|---|---|
| 2023-12-31 | 1055.394 | -46.993 | -1074.265 |
| 2022-12-31 | 1107.137 | -179.622 | -1088.23 |
| 2021-12-31 | 1199.317 | -124.305 | -1025.193 |
| 2020-12-31 | 1035.754 | -95.119 | -774.907 |
# Visualisasi Cash Flow
fig = go.Figure()
# Bar chart Operating Cash Flow
cf1 = go.Bar(
x=cf_convert.index,
y=cf_convert["Cash Flowsfromusedin Operating Activities Direct"],
name = 'Operating',
hovertemplate = None
)
# Bar chart Investing Cash Flow
cf2 = go.Bar(
x=cf_convert.index,
y=cf_convert["Investing Cash Flow"],
name = 'Investing',
hovertemplate = None
)
# Bar chart Financing Cash Flow
cf3 = go.Bar(
x=cf_convert.index,
y=cf_convert["Financing Cash Flow"],
name = 'Financing',
hovertemplate = None
)
# Set data visualisasi Cash Flow
data_cf = [cf1, cf2, cf3]
# Update layout menambahkan judul
layout = go.Layout({
'title': {
'text': 'Cash Flow SIDO',
'font': {
'size': 20
},
'x': 0.5,
'xanchor': 'center'
},
},
hovermode="x unified"
)
# Update axis
fig = go.Figure(data=data_cf, layout=layout)
fig.update_yaxes(title_text="IDR", ticksuffix='B', hoverformat = "d")
fig.update_xaxes(
tickmode='array',
tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
ticktext=[str(year) for year in range(2020, 2024)]
)
Analysis dan Interpretasi
Selama periode 2020 hingga 2023, aliran kas dari aktivitas operasional tetap positif dan konsisten. Pada tahun 2020, aliran kas operasional berada di sekitar 1 triliun IDR dan meningkat menjadi sekitar 1,1 triliun IDR pada tahun 2021, lalu menurun sedikit tetapi masih positif pada tahun 2022 dan 2023. Aliran kas positif dari operasional menunjukkan bahwa SIDO mampu menghasilkan cukup kas dari kegiatan inti bisnisnya untuk mendanai operasional sehari-hari.
Aliran kas dari aktivitas investasi cenderung negatif sepanjang periode 2020 hingga 2023. Aliran kas investasi menunjukkan pengeluaran yang relatif konstan, menunjukkan bahwa SIDO terus berinvestasi dalam aset tetap atau ekspansi bisnis lainnya. Aliran kas negatif dari aktivitas investasi menunjukkan bahwa perusahaan terus berinvestasi dalam pertumbuhan jangka panjangnya.
Aliran kas dari aktivitas pembiayaan juga menunjukkan pola negatif sepanjang periode 2020 hingga 2023. Pada tahun 2020, aliran kas dari aktivitas pembiayaan negatif sekitar 775 miliar IDR dan terus menunjukkan kenaikan tren negatif pada tahun-tahun berikutnya. Aliran kas negatif dari aktivitas pembiayaan menunjukkan bahwa SIDO mungkin telah membayar utang atau membayar dividen kepada pemegang saham.
Secara keseluruhan, grafik ini menunjukkan bahwa SIDO memiliki aliran kas yang sehat dari operasionalnya, berinvestasi untuk pertumbuhan masa depan, dan mengelola kewajiban atau mengembalikan nilai kepada pemegang sahamnya
# Menghitung rasio profitabilitas Return on Equity (ROE)
ROE = ic_cleaned["Net Income"] / bs_cleaned["Total Equity Gross Minority Interest"] *100
ROE
2023-12-31 28.076331 2022-12-31 31.51396 2021-12-31 36.324713 2020-12-31 28.991042 dtype: object
# Menghitung rasio profitabilitas Return on Assets (ROA)
ROA = ic_cleaned["Net Income"] / bs_cleaned["Total Assets"] *100
ROA
2023-12-31 24.433817 2022-12-31 27.066757 2021-12-31 30.988137 2020-12-31 24.263206 dtype: object
# Visualisasi rasio profitabilitas ROE dan ROA
fig = go.Figure()
# Line chart ROE
cf1 = go.Scatter(
x=bs_cleaned.index,
y=ROE,
name = 'Return on Equity (%)',
hovertemplate = None
)
# Line chart ROA
cf2 = go.Scatter(
x=bs_cleaned.index,
y=ROA,
name = 'Return on Assets (%)',
hovertemplate = None
)
# Set data visualisasi rasio profitabilitas I
data_cf = [cf1, cf2]
# Update layout menambahkan judul
layout = go.Layout({
'title': {
'text': 'Profitability Ratios I',
'font': {
'size': 20
},
'x': 0.5,
'xanchor': 'center'
},
},
hovermode="x"
)
# Update axis
fig = go.Figure(data=data_cf, layout=layout)
fig.update_yaxes(title_text="(%)", hoverformat = ".2f")
fig.update_xaxes(
tickmode='array',
tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
ticktext=[str(year) for year in range(2020, 2024)]
)
Analysis dan Interpretasi
SIDO menunjukkan kinerja yang sangat baik pada tahun 2021 dengan peningkatan signifikan pada ROE dan ROA. Namun, profitabilitas perusahaan mengalami penurunan yang konsisten hingga tahun 2023 yang disebabkan oleh normalisasi permintaan, inflasi tinggi karena melemahnya daya beli konsumen, dan kenaikan harga bahan baku.
# Visualisasi Profitability Ratio II (Profit Margin)
fig = go.Figure()
# Bar chart Gross Profit Margin
cf1 = go.Bar(
x=ic_convert.index,
y=gpm,
name = 'Gross Profit Margin (%)',
hovertemplate = None
)
# Bar chart Operating Profit Margin
cf2 = go.Bar(
x=ic_convert.index,
y=opm,
name = 'Operating Profit Margin (%)',
hovertemplate = None
)
# Bar chart Net Profit Margin
cf3 = go.Bar(
x=ic_convert.index,
y=npm,
name = 'Net Profit Margin (%)',
hovertemplate = None
)
# Set data visualisasi rasio profitabilitas (profit margin)
data_cf = [cf1, cf2, cf3]
# Update layout menambahkan judul
layout = go.Layout({
'title': {
'text': 'Profitability Ratios II<br>(Profit Margin)',
'font': {
'size': 18
},
'x': 0.5,
'xanchor': 'center'
},
},
hovermode="x unified"
)
# Update axis
fig = go.Figure(data=data_cf, layout=layout)
fig.update_yaxes(title_text="(%)", hoverformat = ".2f")
fig.update_xaxes(
tickmode='array',
tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
ticktext=[str(year) for year in range(2020, 2024)]
)
Analysis dan Interpretasi
Secara keseluruhan, profit SIDO menunjukkan performa puncak dalam margin laba operasi dan laba bersih pada tahun 2021, namun mengalami penurunan setelah itu. Gross Profit Margin yang konsisten tinggi mengindikasikan bahwa perusahaan tetap efisien dalam produksi, tetapi peningkatan biaya operasional dan biaya lainnya telah mengurangi margin laba operasi dan laba bersih.
# Mengonversi dari satuan dasar ke miliar
liquidity = bs_transposed[["Current Assets", "Current Liabilities", "Cash And Cash Equivalents", "Inventory"]] / 1e9
liquidity
| Current Assets | Current Liabilities | Cash And Cash Equivalents | Inventory | |
|---|---|---|---|---|
| 2023-12-31 | 2066.77 | 461.979 | 830.128 | 408.454 |
| 2022-12-31 | 2194.242 | 541.048 | 923.047 | 542.624 |
| 2021-12-31 | 2244.707 | 543.37 | 1082.219 | 454.81 |
| 2020-12-31 | 2052.081 | 560.043 | 1031.954 | 309.478 |
| 2019-12-31 | NaN | NaN | NaN | NaN |
# Drop data kosong
liq_cleaned = liquidity.dropna(how='all')
liq_cleaned
| Current Assets | Current Liabilities | Cash And Cash Equivalents | Inventory | |
|---|---|---|---|---|
| 2023-12-31 | 2066.77 | 461.979 | 830.128 | 408.454 |
| 2022-12-31 | 2194.242 | 541.048 | 923.047 | 542.624 |
| 2021-12-31 | 2244.707 | 543.37 | 1082.219 | 454.81 |
| 2020-12-31 | 2052.081 | 560.043 | 1031.954 | 309.478 |
# Menghitung Quick Ratio
qr = liq_cleaned["Current Assets"] - liq_cleaned["Inventory"]
quick_ratio = qr / liq_cleaned["Current Liabilities"]
quick_ratio
2023-12-31 3.589592 2022-12-31 3.052627 2021-12-31 3.294067 2020-12-31 3.111552 dtype: object
# Menghitung Current Ratio
current_ratio = liq_cleaned["Current Assets"] / liq_cleaned["Current Liabilities"]
current_ratio
2023-12-31 4.473731 2022-12-31 4.05554 2021-12-31 4.131084 2020-12-31 3.664149 dtype: object
# Menghitung Cash Ratio
cash_ratio = liq_cleaned["Cash And Cash Equivalents"] / liq_cleaned["Current Liabilities"]
cash_ratio
2023-12-31 1.796896 2022-12-31 1.706035 2021-12-31 1.99168 2020-12-31 1.842634 dtype: object
# Visualisasi rasio likuiditas
fig = go.Figure()
# Bar chart Current Ratio
cf1 = go.Bar(
x=bs_convert.index,
y=current_ratio,
name = 'Current Ratio',
hovertemplate = None
)
# Bar chart Quick Ratio
cf2 = go.Bar(
x=bs_convert.index,
y=quick_ratio,
name = 'Quick Ratio',
hovertemplate = None
)
# Bar chart Cash Ratio
cf3 = go.Bar(
x=bs_convert.index,
y=cash_ratio,
name = 'Cash Ratio',
hovertemplate = None
)
# Set data visualisasi rasio likuiditas
data_cf = [cf1, cf2, cf3]
# Update layout menambahkan judul
layout = go.Layout({
'title': {
'text': 'Liquidity Ratios',
'font': {
'size': 18
},
'x': 0.5,
'xanchor': 'center'
},
},
hovermode="x unified"
)
# Update axis
fig = go.Figure(data=data_cf, layout=layout)
fig.update_yaxes(title_text="Ratio Value", hoverformat = ".2f")
fig.update_xaxes(
tickmode='array',
tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
ticktext=[str(year) for year in range(2020, 2024)]
)
Analysis dan Interpretasi Rasio Likuiditas SIDO
Perusahaan SIDO memiliki likuiditas yang sangat baik selama periode 2020-2023, dengan rasio likuiditas yang menunjukkan kemampuan kuat untuk memenuhi kewajiban jangka pendek. Current Ratio yang sangat tinggi menunjukkan bahwa perusahaan memiliki lebih banyak aset lancar dibandingkan kewajiban lancarnya, sementara Quick Ratio yang cukup tinggi menunjukkan bahwa aset lancar yang tidak termasuk persediaan masih cukup untuk menutupi kewajiban jangka pendek. Cash Ratio yang stabil menunjukkan pengelolaan kas yang baik. Secara keseluruhan, SIDO berada dalam posisi likuiditas yang sangat baik selama periode 2020-2023.
# Visualisasi solvabilitas rasio DER dan DAR
fig = go.Figure()
# Line chart DER
cf1 = go.Scatter(
x=bs_cleaned.index,
y=DER,
name = 'Debt on Equity Ratio (%)',
hovertemplate = None
)
# Line chart DAR
cf2 = go.Scatter(
x=bs_cleaned.index,
y=DAR,
name = 'Debt on Assets Ratio (%)',
hovertemplate = None
)
# Set data visualisasi rasio solvabilitas
data_cf = [cf1, cf2]
# Update layout menambahkan judul
layout = go.Layout({
'title': {
'text': 'Solvency Ratios',
'font': {
'size': 20
},
'x': 0.5,
'xanchor': 'center'
},
},
hovermode="x"
)
# Update axis
fig = go.Figure(data=data_cf, layout=layout)
fig.update_yaxes(title_text="(%)", hoverformat = ".2f")
fig.update_xaxes(
tickmode='array',
tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
ticktext=[str(year) for year in range(2020, 2024)]
)
Analysis dan Interpretasi Rasio Solvensi SIDO
Pada tahun 2020, DER berada di sekitar 19% dan menunjukkan tren penurunan hingga mencapai sekitar 15% pada tahun 2023. Penurunan DER dari 2020 hingga 2023 menunjukkan bahwa SIDO secara konsisten mengurangi proporsi utang terhadap ekuitasnya, yang merupakan tanda positif dari peningkatan kesehatan finansial dan pengelolaan utang yang baik.
Pada tahun 2020, DAR berada di sekitar 16% dan menurun secara bertahap hingga sekitar 13% pada tahun 2023. Penurunan DAR menunjukkan bahwa SIDO mengurangi proporsi utangnya terhadap total asetnya, yang berarti perusahaan mengandalkan lebih banyak ekuitas daripada utang untuk mendanai operasional.
Penurunan yang konsisten DER dan DAR menunjukkan bahwa SIDO berhasil mengurangi ketergantungannya pada utang untuk mendanai operasional dan ekspansi bisnis. SIDO menunjukkan peningkatan kesehatan finansial dan kemampuan untuk memenuhi kewajiban jangka panjangnya.
Secara keseluruhan, penurunan DER dan DAR menunjukkan bahwa SIDO berada dalam posisi finansial yang lebih kuat dan lebih stabil dari tahun ke tahun, dengan pengelolaan utang yang baik.
# Mengonversi dari satuan dasar ke miliar
eff = ic_transposed[["Total Revenue", "Operating Revenue", "Cost Of Revenue"]] / 1e9
eff
| Total Revenue | Operating Revenue | Cost Of Revenue | |
|---|---|---|---|
| 2023-12-31 | 3565.93 | 3565.93 | 1547.235 |
| 2022-12-31 | 3865.523 | 3865.523 | 1696.832 |
| 2021-12-31 | 4020.98 | 4020.98 | 1734.948 |
| 2020-12-31 | 3335.411 | 3335.411 | 1496.628 |
| 2019-12-31 | NaN | NaN | NaN |
# Drop data kosong
eff_cleaned = eff.dropna(how='all')
eff_cleaned
| Total Revenue | Operating Revenue | Cost Of Revenue | |
|---|---|---|---|
| 2023-12-31 | 3565.93 | 3565.93 | 1547.235 |
| 2022-12-31 | 3865.523 | 3865.523 | 1696.832 |
| 2021-12-31 | 4020.98 | 4020.98 | 1734.948 |
| 2020-12-31 | 3335.411 | 3335.411 | 1496.628 |
# Mengonversi dari satuan dasar ke miliar
eff2 = bs_transposed[["Total Assets", "Accounts Receivable", "Inventory"]] / 1e9
eff2
| Total Assets | Accounts Receivable | Inventory | |
|---|---|---|---|
| 2023-12-31 | 3890.706 | 788.722 | 408.454 |
| 2022-12-31 | 4081.442 | 686.662 | 542.624 |
| 2021-12-31 | 4068.97 | 664.058 | 454.81 |
| 2020-12-31 | 3849.516 | 663.757 | 309.478 |
| 2019-12-31 | NaN | NaN | NaN |
# Menentukan nilai yang ingin diisi untuk tahun 2019
values_2019 = {
"Total Assets": 352.955,
"Accounts Receivable": 529.405,
"Inventory": 299.244
}
# Mengisi nilai kosong di tahun 2019 dengan nilai yang ditentukan
eff2.loc[eff2.index == "2019-12-31", 'Total Assets'] = values_2019['Total Assets']
eff2.loc[eff2.index == "2019-12-31", 'Accounts Receivable'] = values_2019['Accounts Receivable']
eff2.loc[eff2.index == "2019-12-31", 'Inventory'] = values_2019['Inventory']
eff2
| Total Assets | Accounts Receivable | Inventory | |
|---|---|---|---|
| 2023-12-31 | 3890.706 | 788.722 | 408.454 |
| 2022-12-31 | 4081.442 | 686.662 | 542.624 |
| 2021-12-31 | 4068.97 | 664.058 | 454.81 |
| 2020-12-31 | 3849.516 | 663.757 | 309.478 |
| 2019-12-31 | 352.955 | 529.405 | 299.244 |
# Menggabungkan kedua dataframe berdasarkan indeks
combined = eff_cleaned.join(eff2, how='inner')
# Menghitung rasio Asset Turnover (Total Revenue terhadap Total Assets)
combined['Asset Turnover'] = combined['Total Revenue'] / combined['Total Assets']
# Menghitung rata-rata Accounts Receivable
combined['Average Accounts Receivable'] = (eff2['Accounts Receivable'] + eff2['Accounts Receivable'].shift(-1)) / 2
# Menghitung rata-rata Inventory
combined['Average Inventory'] = (eff2['Inventory'] + eff2['Inventory'].shift(-1)) / 2
# Menampilkan hasil join dengan perhitungan
combined
| Total Revenue | Operating Revenue | Cost Of Revenue | Total Assets | Accounts Receivable | Inventory | Asset Turnover | Average Accounts Receivable | Average Inventory | |
|---|---|---|---|---|---|---|---|---|---|
| 2023-12-31 | 3565.93 | 3565.93 | 1547.235 | 3890.706 | 788.722 | 408.454 | 0.916525 | 737.692 | 475.539 |
| 2022-12-31 | 3865.523 | 3865.523 | 1696.832 | 4081.442 | 686.662 | 542.624 | 0.947097 | 675.36 | 498.717 |
| 2021-12-31 | 4020.98 | 4020.98 | 1734.948 | 4068.97 | 664.058 | 454.81 | 0.988206 | 663.9075 | 382.144 |
| 2020-12-31 | 3335.411 | 3335.411 | 1496.628 | 3849.516 | 663.757 | 309.478 | 0.866449 | 596.581 | 304.361 |
# Menghitung Receivables Turnover
art = combined['Operating Revenue'] / combined['Average Accounts Receivable']
art
2023-12-31 4.833901 2022-12-31 5.723648 2021-12-31 6.056536 2020-12-31 5.590877 Freq: -1A-DEC, dtype: object
# Menghitung Inventory Turnover
itr = combined['Cost Of Revenue'] / combined['Average Inventory']
itr
2023-12-31 3.253645 2022-12-31 3.402395 2021-12-31 4.540037 2020-12-31 4.917279 Freq: -1A-DEC, dtype: object
# Visualisasi rasio efisiensi
fig = go.Figure()
# Bar chart Asset Turnover
cf1 = go.Bar(
x=combined.index,
y=combined['Asset Turnover'],
name = 'Asset Turnover',
hovertemplate = None
)
# Bar chart Receivables Turnover
cf2 = go.Bar(
x=combined.index,
y=art,
name = 'Receivables Turnover',
hovertemplate = None
)
# Bar chart Inventory Turnover
cf3 = go.Bar(
x=combined.index,
y=itr,
name = 'Inventory Turnover',
hovertemplate = None
)
# Setd data visualisasi rasio efisiensi
data_cf = [cf1, cf2, cf3]
# Update layout menambahkan judul
layout = go.Layout({
'title': {
'text': 'Efficiency Ratios',
'font': {
'size': 18
},
'x': 0.5,
'xanchor': 'center'
},
},
hovermode="x unified"
)
# Update axis
fig = go.Figure(data=data_cf, layout=layout)
fig.update_yaxes(title_text="Ratio Value", hoverformat = ".2f")
fig.update_xaxes(
tickmode='array',
tickvals=[f'{year}-12-31' for year in range(2020, 2024)],
ticktext=[str(year) for year in range(2020, 2024)]
)
Analysis dan Interpretasi Rasio Efisiensi SIDO
Perusahaan SIDO menunjukkan efisiensi yang baik dalam mengelola piutang dan persediaannya, terutama pada tahun 2020 dan 2021. Namun, rasio Asset Turnover yang rendah menunjukkan bahwa ada potensi untuk meningkatkan efisiensi dalam penggunaan aset perusahaan. Penurunan rasio Receivables dan Inventory Turnover setelah puncaknya pada tahun 2021 menunjukkan perlunya peningkatan dalam pengelolaan piutang dan persediaan untuk mempertahankan efisiensi operasional yang tinggi. Secara keseluruhan, perusahaan perlu fokus pada peningkatan penggunaan aset untuk meningkatkan pendapatan dan mempertahankan efisiensi operasional.
# Load data history harga saham SIDO dengan tanggal yang sudah ditentukan
df = company.history(start="2019-01-01", end="2023-12-31")
# Menampilkan harga saham SIDO
df.tail()
| Open | High | Low | Close | Volume | Dividends | Stock Splits | |
|---|---|---|---|---|---|---|---|
| Date | |||||||
| 2023-12-21 00:00:00+07:00 | 530.985716 | 535.857145 | 516.371430 | 521.242859 | 18907700 | 0.0 | 0.0 |
| 2023-12-22 00:00:00+07:00 | 521.242890 | 530.985748 | 521.242890 | 526.114319 | 22292100 | 0.0 | 0.0 |
| 2023-12-27 00:00:00+07:00 | 526.114286 | 530.985714 | 511.500000 | 511.500000 | 31984800 | 0.0 | 0.0 |
| 2023-12-28 00:00:00+07:00 | 516.371460 | 521.242889 | 511.500031 | 516.371460 | 17058500 | 0.0 | 0.0 |
| 2023-12-29 00:00:00+07:00 | 516.371429 | 516.371429 | 506.628571 | 511.500000 | 35649900 | 0.0 | 0.0 |
# Visualisasi harga penutupan saham SIDO
fig = go.Figure()
close_price = go.Scatter(
x=df.index,
y=df.Close,
hovertemplate = None
)
data = [close_price]
layout = go.Layout({
'title': {
'text': 'SIDO<br>Industri Jamu dan Farmasi Sido Muncul Tbk',
'font': {
'size': 18
},
'x': 0.5,
'xanchor': 'center'
},
},
hovermode="x"
)
fig = go.Figure(data=data, layout=layout)
fig.show()
# Visualisasi harga saham SIDO dengan candlestick
set_df = {
'x': df.index,
'open': df.Open,
'close': df.Close,
'high': df.High,
'low': df.Low,
'type': 'candlestick',
'name': 'SIDO',
'showlegend': True
}
# Set data visualisasi candlestick dan update layout
data = [set_df]
layout = go.Layout({
'title': {
'text': 'SIDO<br>Industri Jamu dan Farmasi Sido Muncul Tbk',
'font': {
'size': 18
},
'x': 0.5,
'xanchor': 'center'
}
})
# Menampilkan visualisasi
fig = go.Figure(data=data, layout=layout)
fig.show()
# Visualisasi harga dan volume saham SIDO dengan candlestick
fig = make_subplots(rows=2, cols=1, shared_xaxes=True, row_width=[0.30, 0.70])
# Candlestick harga saham SIDO
fig.add_trace(go.Candlestick(
x=df.index,
open=df['Open'],
high=df['High'],
low=df['Low'],
close=df['Close'],
showlegend=False
), row=1, col=1)
# Volume saham SIDO
fig.add_trace(go.Scatter(
x=df.index,
y=df.Volume,
fill='tonexty',
line_color='skyblue',
showlegend=False,
), row=2, col=1)
# Update layout menambahkan judul
fig.update_layout(
title=dict(
text="SIDO<br>Industri Jamu dan Farmasi Sido Muncul Tbk",
x=0.5,
y=0.9,
font=dict(size=18)
)
)
# Distribusi harga saham SIDO
fig = px.histogram(df, x=df['Close'], nbins=50, histnorm='density', title='Distribusi Harga Saham SIDO')
fig.update_layout(
title=dict(
text="Distribusi Harga Saham SIDO",
x=0.5,
y=0.9,
font=dict(size=18)
)
)
# Copy data
df2 = df.copy()
# Menghitung Daily returns
daily_return = df2[['Close']]
daily_change = daily_return.pct_change() #pt-pt1/pt1
# Visualisasi daily return
fig = px.line(daily_change, x=daily_change.index, y=daily_change.Close, markers=True, title='Daily Return')
# Update layout
fig.update_traces(line_dash='dash', marker=dict(symbol='circle'))
fig.update_layout(
title=dict(
text="Daily Return",
x=0.5,
y=0.9,
font=dict(size=18)
),
xaxis_title='Date',
legend_title='Legends'
)
# Menampilkan grafik
fig.update_yaxes(title_text="Change", hoverformat = ".3f")
# Distribusi daily return
df2['Daily Return'] = daily_change
fig = px.histogram(df, x=df2['Daily Return'].dropna(), nbins=100, title='Daily Return')
fig.update_layout(
title=dict(
text="Distribusi Daily Return",
x=0.5,
y=0.9,
font=dict(size=18)
)
)
# Moving Average 50 hari dan 200 hari
df2['MA_50'] = df2['Close'].rolling(window=50).mean()
df2['MA_200'] = df2['Close'].rolling(window=200).mean()
# Visualisasi Moving Average
fig = go.Figure()
# Line chart harga saham
ma_close = go.Scatter(
x=df2.index,
y=df2.Close,
name = 'Close Price',
hovertemplate = None
)
# Line chart MA 50 hari
ma50 = go.Scatter(
x=df2.index,
y=df2['MA_50'],
name = 'MA 50 Days',
hovertemplate = None
)
# Line chart MA 200 hari
ma200 = go.Scatter(
x=df2.index,
y=df2['MA_200'],
name = 'MA 200 Days',
hovertemplate = None
)
# Set data visualisasi MA
data_ma = [ma_close, ma50, ma200]
# Update layout
layout = go.Layout({
'title': {
'text': 'Moving Average SIDO',
'font': {
'size': 18
},
'x': 0.5,
'xanchor': 'center'
},
},
hovermode="x unified", plot_bgcolor='rgba(37,37,37,1)'
)
# Menampilkan grafik
fig = go.Figure(data=data_ma, layout=layout)
fig.show()
Analisis dan Interpretasi Moving Average SIDO
# Visualisasi Moving Averange dengan Candlestcik
# Candlestick MA 50 hari
cdl_ma50 = {
'x': df2.index,
'y': df2['MA_50'],
'type': 'scatter',
'mode': 'lines',
'line': {
'width': 1,
'color': 'lime'
},
'name': 'Moving Average 50 hari'
}
# Candlestick MA 200
cdl_ma200 = {
'x': df2.index,
'y': df2['MA_200'],
'type': 'scatter',
'mode': 'lines',
'line': {
'width': 1,
'color': 'yellow'
},
'name': 'Moving Average 200 hari'
}
# Set data visualisasi MA dengan candlestick
dataMA = [set_df, cdl_ma50, cdl_ma200]
# Update layout
layout = go.Layout({
'title': {
'text': 'Moving Averange SIDO',
'font': {
'size': 25
},
'x': 0.5,
'xanchor': 'center'
},
}, plot_bgcolor='rgba(37,37,37,1)')
# Menampilkan grafik
fig = go.Figure(data=dataMA, layout=layout)
fig.show()
Analisis dan Interpretasi Moving Average SIDO
Golden Cross terjadi ketika MA 50 hari melintasi MA 200 hari dari bawah ke atas, yang bisa dianggap sebagai sinyal bullish. Hal ini terlihat terjadi beberapa kali, misalnya awal tahun 2021.
Death Cross terjadi ketika MA 50 hari melintasi MA 200 hari dari atas ke bawah, yang bisa dianggap sebagai sinyal bearish. Hal ini terlihat terjadi pada pertengahan tahun 2022.
Perbedaan antara harga penutupan dan moving average, serta seberapa sering garis-garis ini saling silang, menunjukkan tingkat volatilitas. Perioda dengan volatilitas tinggi biasanya ditandai dengan lebih seringnya garis-garis ini bersilangan dan deviasi yang lebih besar dari MA.
# Indikator Moving Average Convergence Divergence
EMA_12 = pd.Series(df2['Close'].ewm(span=12, min_periods=12).mean())
EMA_26 = pd.Series(df2['Close'].ewm(span=26, min_periods=26).mean())
MACD = pd.Series(EMA_12 - EMA_26)
MACD_signal = pd.Series(MACD.ewm(span=9, min_periods=9).mean())
# Chart EMA 12 hari dan 26 hari, serta chart MACD
fig = make_subplots(rows=2, cols=1)
fig.add_trace(go.Scatter(x=df2.index, y=df2.Close, name='Close'), row=1, col=1)
fig.add_trace(go.Scatter(x=df2.index, y=EMA_12, name='EMA 12'), row=1, col=1)
fig.add_trace(go.Scatter(x=df2.index, y=EMA_26, name='EMA 26'), row=1, col=1)
fig.add_trace(go.Scatter(x=df2.index, y=MACD, name='MACD'), row=2, col=1)
fig.add_trace(go.Scatter(x=df2.index, y=MACD_signal, name='Signal line'), row=2, col=1)
# Update layout
fig.update_layout(
title=dict(
text="Moving Average Convergence Divergence",
x=0.5,
y=0.9,
font=dict(size=18)
),
plot_bgcolor='rgba(37,37,37,1)',
hovermode='x'
)
# Menampilkan grafik
fig.show()
Analisis dan Interpretasi MACD SIDO
Pergerakan garis MACD relatif terhadap zero line dan signal line dapat menunjukkan apakah momentum pasar sedang meningkat atau menurun di kedua arah tren. Fluktuasi tajam pada garis MACD dan frekuensi cross-overs menunjukkan periode volatilitas tinggi.
Bollinger Bands berguna untuk mengukur volatilitas serta potensi titik balik pasar.
# Bollinger Bands
df2['STD_50'] = df2['Close'].rolling(window=50).std()
# Menghitung upper dan lower band
upper_bb = df2['MA_50'] + (df2['STD_50'] * 2)
lower_bb = df2['MA_50'] - (df2['STD_50'] * 2)
# Visualisasi Bollinger Bands
fig = go.Figure()
# Line chart Upper Bollinger Bands
upBB = go.Scatter(
x=df2.index,
y=upper_bb,
name = 'Upper BB',
hovertemplate = None
)
# Line chart Lower Bollinger Bands
lowBB = go.Scatter(
x=df2.index,
y=lower_bb,
name = 'Lower BB',
hovertemplate = None
)
# Set data visualisasi Bollinger Bands
data_bb = [ma_close, upBB, ma50, lowBB]
# Update layout
layout = go.Layout({
'title': {
'text': 'Bollinger Bands',
'font': {
'size': 25
},
'x': 0.5,
'xanchor': 'center'
},
}, hovermode="x unified", plot_bgcolor='rgba(37,37,37,1)'
)
# Menampilkan grafik
fig = go.Figure(data=data_bb, layout=layout)
fig.show()
Analisis dan Interpretasi Bollinger Bands SIDO
# Visualisasi Bollinger Bands dengan Candlestcik
# Line chart Upper Bollinger Bands
bb_up = {
'x': df2.index,
'y': upper_bb,
'type': 'scatter',
'mode': 'lines',
'line': {
'width': 1,
'color': 'dodgerblue'
},
'name': 'UPPER BB'
}
# Line chart Lower Bollinger Bands
bb_low = {
'x': df2.index,
'y': lower_bb,
'type': 'scatter',
'mode': 'lines',
'line': {
'width': 1,
'color': 'yellow'
},
'name': 'LOWER BB'
}
# Set data visualisasi candlestick Bollinger Bands
dataBB = [set_df, bb_up, cdl_ma50 , bb_low]
# Update layout
layout = go.Layout({
'title': {
'text': 'Bollinger Bands',
'font': {
'size': 25
},
'x': 0.5,
'xanchor': 'center'
},
}, plot_bgcolor='rgba(37,37,37,1)')
# Menampilkan grafik
fig = go.Figure(data=dataBB, layout=layout)
fig.show()
Analisis dan Interpretasi Bollinger Bands SIDO
Menuju pertengahan 2023, harga sering menyentuh lower band dan berada di bawah MA 50 hari, mengindikasikan kondisi bearish dengan potensi stabilisasi atau bahkan penurunan lebih lanjut.
RSI adalah indikator momentum yang digunakan dalam analisis teknikal untuk mengukur kecepatan dan perubahan pergerakan harga.
# Fungsi menghitung RSI periode 14 hari
def rsi(close, periods = 14):
# Menghitung perubahan harga
close_delta = close.diff()
# Memisahkan perubahan harga menjadi nilai positif dan negatif
up = close_delta.clip(lower=0)
down = -1 * close_delta.clip(upper=0)
# Menghitung EMA dari perubahan positif dan negatif
ma_up = up.ewm(com = periods - 1, adjust=True, min_periods = periods).mean()
ma_down = down.ewm(com = periods - 1, adjust=True, min_periods = periods).mean()
# Menghitung RSI dari MA
rsi = ma_up / ma_down
rsi = 100 - (100/(1 + rsi))
return rsi
# Menghitung RSI
df2['RSI'] = rsi(df2['Close'])
# Visualisasi harga saham SIDO dan RSI
fig = make_subplots(rows=2, cols=1, shared_xaxes=True, row_width=[0.40, 0.60])
# Line chart harga saham SIDO
fig.add_trace(
go.Scatter(x=df2.index,
y=df2['Close'],
name = 'Close Price',
fill='tonexty',
hovertemplate = None
), row=1, col=1)
# Line chart RSI
fig.add_trace(
go.Scatter(x=df2.index,
y=df2['RSI'],
name = 'RSI',
line=dict(color="green"),
hovertemplate = None
), row=2, col=1)
# Menambahkan garis upper/lower bounds
fig.update_yaxes(range=[-10, 110], row=2, col=1)
fig.add_hline(y=0, col=1, row=2, line_color="#666", line_width=2)
fig.add_hline(y=100, col=1, row=2, line_color="#666", line_width=2)
# Menambahkan garis/dash overbought (>70) dan oversold (<30)
fig.add_hline(y=30, col=1, row=2, line_color='#336699', line_width=2, line_dash='dash')
fig.add_hline(y=70, col=1, row=2, line_color='#336699', line_width=2, line_dash='dash')
# Update layout
fig.update_layout(
title=dict(
text="Relative Strength Index",
x=0.5,
y=0.9,
font=dict(size=18)
),
hovermode="x"
)
Analisis dan Interpretasi RSI SIDO
# Visualisasi RSI
fig = make_subplots()
# Line chart RSI
fig.add_trace(
go.Scatter(x=df2.index,
y=df2['RSI'],
name = 'RSI',
line=dict(color="blue"),
hovertemplate = None
))
# Menambahkan garis upper/lower bounds
fig.update_yaxes(range=[-10, 110], hoverformat = ".2f")
fig.add_hline(y=0, line_color="black", line_width=2)
fig.add_hline(y=100, line_color="black", line_width=2)
# Menambahkan garis/dash overbought (>70) dan oversold (<30)
fig.add_hline(y=30, line_color='red', line_width=2, line_dash='dash')
fig.add_hline(y=70, line_color='red', line_width=2, line_dash='dash')
# Update layout
fig.update_layout(
title=dict(
text="Relative Strength Index",
x=0.5,
y=0.9,
font=dict(size=18)
),
hovermode="x",
yaxis_title='RSI'
)
Analisis dan Interpretasi RSI SIDO
Tidak ada tren yang jelas dominan dalam jangka panjang, yang menunjukkan bahwa harga saham mungkin berfluktuasi dalam rentang yang lebih luas, dengan momentum bullish dan bearish yang bergantian.
# Tentukan periode
k_period = 14
d_period = 3
# Menambahkan kolom "n_high" dengan nilai maksimum dari 14 periode sebelumnya
n_high = df2['High'].rolling(k_period).max()
# Menambahkan kolom "n_low" dengan nilai minimum dari 14 periode sebelumnya
n_low = df2['Low'].rolling(k_period).min()
# Menggunakan nilai min/max untuk menghitung %k
df2['%K'] = (df2['Close'] - n_low) * 100 / (n_high - n_low)
# Menggunakan %k untuk menghitung SMA dari 3 nilai terakhir dari %k
df2['%D'] = df2['%K'].rolling(d_period).mean()
# Import library pandas_ta
import pandas_ta as ta
# Menambahkan beberapa parameter
df2.ta.stoch(high='high', low='low', k=14, d=3, append=True)
| STOCHk_14_3_3 | STOCHd_14_3_3 | |
|---|---|---|
| Date | ||
| 2019-01-18 00:00:00+07:00 | NaN | NaN |
| 2019-01-21 00:00:00+07:00 | NaN | NaN |
| 2019-01-22 00:00:00+07:00 | 2.777759 | NaN |
| 2019-01-23 00:00:00+07:00 | 2.777759 | NaN |
| 2019-01-24 00:00:00+07:00 | 21.618294 | 9.057937 |
| ... | ... | ... |
| 2023-12-21 00:00:00+07:00 | 62.025336 | 64.838282 |
| 2023-12-22 00:00:00+07:00 | 49.252036 | 59.174042 |
| 2023-12-27 00:00:00+07:00 | 31.607208 | 47.628193 |
| 2023-12-28 00:00:00+07:00 | 21.818188 | 34.225811 |
| 2023-12-29 00:00:00+07:00 | 13.400665 | 22.275354 |
1219 rows × 2 columns
# Visualisasi indikator Stochastic
fig = make_subplots(rows=2, cols=1, shared_xaxes=True)
# Line chart harga saham SIDO
fig.add_trace(
go.Scatter(x=df2.index,
y=df2['Close'],
name = 'Close Price',
fill='tonexty',
hovertemplate = None
), row=1, col=1)
# Line chart K Stochastic
fig.add_trace(
go.Scatter(x=df2.index,
y=df2['STOCHk_14_3_3'],
name = 'K Stochastic',
line=dict(color="lime"),
hovertemplate = None
), row=2, col=1)
# Line chart D Stochastic
fig.add_trace(
go.Scatter(x=df2.index,
y=df2['STOCHd_14_3_3'],
name = 'D Stochastic',
line=dict(color="orange"),
hovertemplate = None
), row=2, col=1)
# Menambahkan garis upper/lower bounds
fig.update_yaxes(range=[-10, 110], row=2, col=1, hoverformat = ".2f")
fig.add_hline(y=0, col=1, row=2, line_color="#666", line_width=2)
fig.add_hline(y=100, col=1, row=2, line_color="#666", line_width=2)
# Menambahkan garis/dash overbought (>80) dan oversold (<20)
fig.add_hline(y=20, col=1, row=2, line_color='#336699', line_width=2, line_dash='dash')
fig.add_hline(y=80, col=1, row=2, line_color='#336699', line_width=2, line_dash='dash')
# Update layout
fig.update_layout(
title=dict(
text="Stochastic Indicator",
x=0.5,
y=0.9,
font=dict(size=18)
),
hovermode="x",
plot_bgcolor='rgba(37,37,37,1)'
)
Analisis dan Interpretasi Indikator Stochastic SIDO
Indikator Stochastic menunjukkan bahwa saham SIDO sering kali mengalami fase overbought dan oversold dalam beberapa tahun terakhir. Ini memberikan peluang bagi trader untuk melakukan aksi beli di area oversold dan aksi jual di area overbought.
Namun, seperti dengan indikator sebelumnya, penting untuk menggunakan indikator ini bersama dengan analisis teknikal lainnya untuk membuat keputusan investasi yang lebih baik.